/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.utils;

import java.io.File;
import java.io.IOException;

/**
 * Klasa użytkowa związana z operacjami na plikach i ścieżkach do plików
 * @author Marcin Kwapisz
 */
public class FileUtils {

    /**
     * Tworzy ścieżkę katalogu docelowego sprawdzając czy podana ścieżka jest prawidłowa
     * @param targetDir - ścieżka do katalogu docelowego
     * @throws IOException - nie można utworzyć doeclowego katalogu, 
     * albo ścieża do niego została podana w sposób nieprawidłowy
     * @return Utworzony katalog
     */
    public static File createDirectory(String targetDir) throws IOException {
        //czy katalog docelowy istnieje. Jezeli nie to go załóż
        File targetDirFile = new File(targetDir);
        //potrzebne tylko do sprawdzenia czy ścieżka jest prawidłowa
        targetDirFile.getCanonicalPath();
        if (!targetDirFile.exists()) {
            boolean created = targetDirFile.mkdirs(); //tworzy ścieżkę katalogów
            if (!created) {
                throw new IOException("Cannot create directory " + targetDir);
            }
        }
        return targetDirFile;
    }

    /**
     * Dodaje na koniec ścieżki separator ścieżki. W zależności od systemu
     * jest to / albo \. Jeżeli na końcu jest już taki znak to zwraca podaną 
     * ścieżką
     * @param path ścieżka 
     * @return ścieżka zakończona sepearatorem ścieżki
     */
    public static String appendFileSeparator(String path) {
        if (path.endsWith(File.separator)) {
            return path;
        } else if (path.endsWith("/")) {
            return path;
        } else {
            return path + File.separator;
        }
    }

    /**
     * Łączy dwie podane ścieżki i sprawdza jej poprawność 
     * @param parent - ścieżka do katalogu głównego
     * @param child - ścieżka do podkatalogu bądź pliku
     * @return połączona ścieżka 
     * @throws IOException - gdy zbudowana ścieżka jest niepoprawna
     */
    public static String joinPaths(String parent, String child) throws IOException {
        File file = new File(parent, child);
        file.getCanonicalPath();
        return file.getPath();
    }

    /**
     * Łączy dwie podane ścieżki i sprawdza jej poprawność
     * @param parent - ścieżka do katalogu głównego
     * @param child - ścieżka do podkatalogu bądź pliku
     * @return połączona ścieżka 
     * @throws IOException - gdy zbudowana ścieżka jest niepoprawna
     */
    public static File joinPaths(File parent, String child) throws IOException {
        File file = new File(parent, child);
        file.getCanonicalPath();//sprawdź czy ścieżka jest prawidłowa
        return file;
    }

    /**
     * Łączy dwie podane ścieżki i sprawdza jej poprawność
     * @param parent - ścieżka do katalogu głównego
     * @param child - ścieżka do podkatalogu bądź pliku
     * @return połączona ścieżka 
     * @throws IOException 
     */
    public static StringBuilder joinPaths(StringBuilder builder, String parent, String child) throws IOException {
        return builder.append(joinPaths(parent, child));
    }

    /**
     * sprawdza czy plik albo katalog istnieje
     * @param path - ścieżka do pliku bądź katalogu
     * @return true jeżeli plik bądź katalog istnieją
     */
    public static boolean isFileExists(String path) {
        if (path != null && path.length() > 0) {
            File file = new File(path);
            return file.exists();
        }
        return false;
    }

    public static boolean checkPath(String path)  {
        File file =new File(path);
        return checkPath(file);
        
    }
    
    public static boolean checkPath(File file)  {
        try {
            file.getCanonicalPath();
            return true;
        } catch (IOException ex) {
            return false;
        }
    }
}
